#ifndef DEFAULT_GAME_IMPL_HPP
#define DEFAULT_GAME_IMPL_HPP

////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Window/ContextSettings.hpp>
#include <SFML/Window/Event.hpp>
#include <SFML/Window/WindowStyle.hpp>
#include <SFML/System/Clock.hpp>
#include <SFML/Graphics/Color.hpp>

#include <SmegTools/Config.h>
#include <SmegTools/Pattern/Clonable.hpp>

#include <SmegTools/Debug/DebugNew.hpp>

namespace sf {
    class RenderWindow;
}

namespace smeg {
    namespace core {

////////////////////////////////////////////////////////////
/// Represents a base DefaultGameImpl with the classic game loop
////////////////////////////////////////////////////////////
class DefaultGameImpl : public tools::Clonable< DefaultGameImpl >
{
public:
    ////////////////////////////////////////////////////////////
    /// Constructor/Destructor
    ///
    ////////////////////////////////////////////////////////////
                        DefaultGameImpl();
    virtual             ~DefaultGameImpl();

    ////////////////////////////////////////////////////////////
    /// Init the game
    ///
    /// \param _pRenderWindow
    ///
    ////////////////////////////////////////////////////////////
    virtual void        Init( sf::RenderWindow* _pRenderWindow );

    ////////////////////////////////////////////////////////////
    /// DeInit the game
    ///
    ////////////////////////////////////////////////////////////
    virtual void        DeInit();

    ////////////////////////////////////////////////////////////
    /// Manage an incoming event
    ////////////////////////////////////////////////////////////
    virtual void        ManageEvent( const sf::Event& _Event );

    ////////////////////////////////////////////////////////////
    /// Call all the Update in the other systems
    ////////////////////////////////////////////////////////////
    virtual void        Update( float _fDeltaTime );

    ////////////////////////////////////////////////////////////
    /// Call all the Render in the other systems
    ////////////////////////////////////////////////////////////
    virtual void        Render();

    /*********************** Accessors ************************/
    sf::RenderWindow*   GetRenderWindow() const;

    void                SetClearColor( const sf::Color& _Color );
    const sf::Color&    GetClearColor() const;

protected:
    /******************* Protected members ********************/
    sf::RenderWindow*   m_pRenderWindow;

#ifdef _DEBUG
public:
    virtual void        DebugRender() const;
#endif // _DEBUG
};

/************************** Inline ************************/
inline sf::RenderWindow* DefaultGameImpl::GetRenderWindow() const {
    return m_pRenderWindow;
}

    } // namespace core
} // namespace smeg

#include <SmegTools/Debug/DebugNewOff.hpp>

#endif // DEFAULT_GAME_IMPL_HPP
